home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / WINDOWS / PROFFT.ARJ / PROFFT.H < prev    next >
C/C++ Source or Header  |  1992-04-28  |  29KB  |  727 lines

  1. /****************************************************************************
  2.     PROFFT.H     Denne filen inneholder (i denne rekkef°lgen):
  3. *****************************************************************************
  4. PROTOTYPER:
  5. extern HANDLE hByteToComplexTable;
  6. extern BOOL bCircleRubber;
  7. extern BOOL bShiftCenter;
  8. void SetBMPPixel(HANDLE hBitmap, int iX, int iY, int iW, int iH, BYTE Colour);
  9. BYTE GetBMPPixel(HANDLE hBitmap, int iX, int iY, int iW, int iH);
  10. void SetComplex(HANDLE hComplex, int iX, int iY, int iW, int iH, prcomplex *compZ);
  11. void GetComplex(HANDLE hComplex, int iX, int iY, int iW, int iH, prcomplex *compZ);
  12.  
  13. KLASSEDEFINISJONER:
  14. class TPROffApp : public TApplication
  15. class TMainWindow : public TMDIFrame
  16. class TProgressDialog : public TDialog
  17. class TGenericPicWindow : public TWindow
  18. class TPictureWindow : public TGenericPicWindow
  19. class TComplexWindow : public TGenericPicWindow
  20. class TPROfftFileDialog : public TFileDialog
  21. class TFilter1 : public TDialog
  22. class TFilter2 : public TDialog
  23. class TOptions : public TDialog
  24. ****************************************************************************/
  25.  
  26. #ifndef __PROFFT_H
  27. #define __PROFFT_H
  28.  
  29. #ifndef __STRING_H
  30. #include <string.h>
  31. #endif
  32.  
  33. #ifndef __FILEDIAL_H
  34. #include <filedial.h>
  35. #endif
  36.  
  37. #ifndef __PROFFTID_H
  38. #include "profftid.h"
  39. #endif
  40.  
  41. #ifndef __PRCOMP_H
  42. #include "prcomp.h"
  43. #endif
  44.  
  45. /****************************************************************************
  46. Se PROFFT.CPP for deklarering av variablene under
  47. ****************************************************************************/
  48. extern HANDLE hByteToComplexTable;
  49. extern BOOL bCircleRubber;
  50. extern BOOL bShiftCenter;
  51.  
  52.  
  53. /****************************************************************************
  54.                             SetBMPPixel (see MISCFUNC.CPP for description)
  55. ****************************************************************************/
  56. void SetBMPPixel(HANDLE hBitmap, int iX, int iY, int iW, int iH, BYTE Colour);
  57.  
  58.  
  59. /****************************************************************************
  60.                             GetBMPPixel (see MISCFUNC.CPP for description)
  61. ****************************************************************************/
  62. BYTE GetBMPPixel(HANDLE hBitmap, int iX, int iY, int iW, int iH);
  63.  
  64.  
  65. /****************************************************************************
  66.                             SetComplex (see COMPWIN.CPP for description)
  67. ****************************************************************************/
  68. void SetComplex(HANDLE hComplex, int iX, int iY, int iW, int iH, prcomplex *compZ);
  69.  
  70.  
  71. /****************************************************************************
  72.                             GetComplex (see COMPWIN.CPP for description)
  73. ****************************************************************************/
  74. void GetComplex(HANDLE hComplex, int iX, int iY, int iW, int iH, prcomplex *compZ);
  75.  
  76.  
  77. /****************************************************************************
  78.                                         fft (see FFT.CPP for description)
  79. ****************************************************************************/
  80. int fft(prcomplex *z1, prcomplex *z2, int n);
  81.  
  82.  
  83. /****************************************************************************
  84.                                 PowerOf2 (see GENPWIN.CPP for description)
  85. ****************************************************************************/
  86. int PowerOf2(long l);
  87.  
  88.  
  89. class TPROffApp : public TApplication
  90. /****************************************************************************
  91. Starter opp applikasjonen. Instansieres av statisk variabel i WinMain.
  92. Konstruktoren kaller InitMainWindow() som vi har tatt over i vσr applikasjon,
  93. og vi fσr dermed kontrollen.
  94.  
  95. Superklasser:    TApplication
  96.  
  97. Subklasser: Ingen.
  98.  
  99. Kompatibilitet:  Kun med ObjectWindows klassebibliotek for Borland C++ 3.0.
  100.  
  101. Skrevet av: MK
  102.  
  103. Sist forandret:
  104.     12.3.92/MK: Lagde klassedefinisjonen
  105. ***************************************************************************/
  106. {
  107. public:
  108.     TPROffApp(LPSTR AName, HANDLE hInstance, HANDLE hPrevInstance,
  109.         LPSTR lpCmdLine, int nCmdShow)
  110.         : TApplication(AName, hInstance, hPrevInstance, lpCmdLine, nCmdShow)
  111.         {HAccTable=LoadAccelerators(hInstance, "PROFFTACC");};
  112. private:
  113.     virtual void InitMainWindow();
  114. };
  115.  
  116. class TMainWindow : public TMDIFrame
  117. /****************************************************************************
  118. Dette er hovedobjektet (hovedvinduet) i applikasjonen vσr. Det er dette
  119. vinduet som mottar alle beskjeder fra menyen og som sender beskjeden
  120. videre til et eventuellt barnevindu (TPictureWindow eller TComplexWindow).
  121. Det hσndterer ogsσ alle barnevinduer m.h.p. posisjon, ikonisering o.l.
  122.  
  123. Alle medlemsfunksjonene finnes og er nµrmere beskrevet i MAINWIN.CPP.
  124.  
  125. Instansieres av TApplication.InitMainWindow()
  126.  
  127. Superklasser:    TMDIFrame
  128.  
  129. Subklasser:    Ingen.
  130.  
  131. Skrevet av:    MK
  132.  
  133. Sist forandret:
  134.     12.3.92/MK: Lagde klassedefinisjonen
  135.     24.3.92/MK: La inn initialiseringskode for σ lage 64 fargers grσtonepalette.
  136.     24.4.92/MK: Forandret fra 64 til 256 grσtoner.
  137. Eventuellt:
  138. ****************************************************************************/
  139. {
  140. public:
  141.     //  Initialisering og deallokering..
  142.     TMainWindow(LPSTR ATitle);
  143.     ~TMainWindow();
  144.  
  145.     //  Opprettelse av barnevinduer/objekter..
  146.     virtual PTWindowsObject CreateChild(LPSTR FileName,
  147.                                                                 BITMAPINFO *bmpInfo, HBITMAP hBitmap);
  148.     virtual PTWindowsObject CreateComplexChild(LPSTR lpszCaption,
  149.             HANDLE hComplexPict, BITMAPINFO *bmpInfo, HANDLE hBitmap);
  150.  
  151.     //  F°lgende funksjoner svarer pσ beskjeder fra Windows..
  152.     BOOL WMQueryNewPalette(TMessage&) = [WM_QUERYNEWPALETTE];
  153.     virtual void WMIdle(TMessage& Msg) = [WM_ENTERIDLE];
  154.     virtual void WMDrawClipboard(TMessage& Msg) = [WM_DRAWCLIPBOARD];
  155.     virtual void WMChangeCBChain(TMessage& Msg) = [WM_CHANGECBCHAIN];
  156.  
  157.     //  F°lgende funksjoner svarer pσ menyvalg fra vσr applikasjon..
  158.     virtual void CMFileOpen(TMessage&) = [CM_FIRST + CM_MDIFILEOPEN];
  159.     virtual void CMFileSaveAs(TMessage&) = [CM_FIRST + CM_FILESAVEAS];
  160.     virtual void CMEditCut(TMessage&) = [CM_FIRST + CM_EDITCUT];
  161.     virtual void CMEditCopy(TMessage&) = [CM_FIRST + CM_EDITCOPY];
  162.     virtual void CMEditPaste(TMessage&) = [CM_FIRST + CM_EDITPASTE];
  163.     virtual void CMTransformFFT(TMessage&) = [CM_FIRST + CM_TRANSFFT];
  164.     virtual void CMTransformInvert(TMessage&) = [CM_FIRST + CM_TRANSINVERT];
  165.     virtual void TMainWindow::CMTransformIFFT(TMessage&) = [CM_FIRST + CM_TRANSIFFT];
  166.     virtual void CMFilterLowpass(TMessage&) = [CM_FIRST + CM_FILTERLOWPASS];
  167.     virtual void CMFilterBandpass(TMessage&) = [CM_FIRST + CM_FILTERBANDPASS];
  168.     virtual void CMFilterHighpass(TMessage&) = [CM_FIRST + CM_FILTERHIGHPASS];
  169.     virtual void CMFilterBandstop(TMessage&) = [CM_FIRST + CM_FILTERBANDSTOP];
  170.     virtual void CMFilterBWLowpass(TMessage&) = [CM_FIRST + CM_FILTERBWLOWPASS];
  171.     virtual void CMFilterBWHighpass(TMessage&) = [CM_FIRST + CM_FILTERBWHIGHPASS];
  172.     virtual void CMFilterFreehand(TMessage&) = [CM_FIRST + CM_FILTERFREEHAND];
  173.     virtual void CMFilterOptions(TMessage&) = [CM_FIRST + CM_FILTEROPTIONS];
  174.     virtual void CMHelpIndex(TMessage&) = [CM_FIRST + CM_HELPINDEX];
  175.     virtual void CMHelpAbout(TMessage&) = [CM_FIRST + CM_HELPABOUTPROFFT];
  176.  
  177.     //  St°ttefunksjoner for andre som bruker dette objektet
  178.     //  sine datamedlemmer.
  179.     void SetRubberSize(int iSize);
  180.     int GetRubberSize();
  181.     HPALETTE CreateGrayscalePalette();
  182.  
  183.     //  Medlemsvariable..
  184.     HPALETTE hPal;        //  Brukes av TPictureWindow og TComplexWindow
  185.                                         //  Inneholder en handle til en 256 grσtoners
  186.                                         //  palette. Sparer plass ved σ si at alle
  187.                                         //  barnevinduene bruker hovedvinduet sin palette.
  188.     HCURSOR hcrWait;    //  Brukes av flere for σ vise timeglasset.
  189.                                         //  Hentes fram under initialisering av TMainWindow
  190.                                         //  objektet og brukes siden av forskjellige objekter
  191.                                         //  i systemet for σ vise timeglasset.
  192.     HPEN hRubber;            //  Brukes av TComplexWindow til σ tegne filtre.
  193.                                         //  Lages under initialisering av TMainWindow.
  194.     HCURSOR hcrRubber;//  Brukes av TComplexWindow for σ tegne filtercursor
  195.                                         //  Lages under initialiseringen av TMainWindow.
  196.                                         //  Forandres hvis brukeren forandre st°rrelse/
  197.                                         //  form i TOptions dialogboksen.
  198. private:
  199.     //  Private st°ttefunksjoner
  200.     void SetupWindow();
  201.     virtual BOOL CanClose();
  202.     BOOL CheckForHelp(int CM_ID);
  203.     BOOL LoadBitmapFile(LPSTR Name);
  204.     BOOL SaveBitmapFile(LPSTR Name);
  205.     BOOL OpenDIB(int TheFile, LPSTR FileName);
  206.     void GetBitmapData(int TheFile, HANDLE BitsHandle, long BitsByteSize);
  207.     void WriteBitmapData(int TheFile, HANDLE BitsHandle,long BitsByteSize);
  208.     void CreateClipboardChild();
  209.     void ChangeRubber();
  210.     virtual void GetWindowClass(WNDCLASS& wc);
  211.     virtual LPSTR GetClassName();
  212.  
  213.     HWND hwndNextViewer;    //  Handle til neste vindu i Clipboardviewer
  214.                                                 //  kjeden. Kreves av Windows for at man skal
  215.                                                 //  fσ tilgang til clipboard dataene og beskjed
  216.                                                 //  nσr dataene forandres. Brukes av
  217.                                                 //  WMDrawClipboard og WMChangeCBChain.
  218.     int iRubberSize;            //  Inneholder st°rrelsen pσ viskelµret.
  219.                                                 //  Brukes av SetRubberSize og GetRubberSize.
  220.                                                 //  Forandres nσr brukeren velger ny st°rrelse
  221.                                                 //  i Options dialogboksen.
  222.     BOOL bHelp;                        //  Settes hvis brukeren trykker hjelp.
  223.                                                 //  Oppdateres av WMIdle som sjekker om
  224.                                                 //  brukeren trykker shift F1.
  225.  
  226.     //  De f°lgende variable brukes til σ lage viskelµrcursoren.
  227.     //  De initialiseres i SetupWindow og forandres senere v.h.a.
  228.     //  SetRubberSize som kalles nσr brukeren velger Options
  229.     //  dialogboksen.
  230.     HDC hdcBitmap;
  231.     int cxCursor, cyCursor, cbSize;
  232.     HBITMAP hbm, hbmOld;
  233.     HANDLE hmemAND, hmemXOR;
  234.     LPSTR lpAND, lpXOR;
  235.     HBRUSH hbrWhite, hbrBlack;
  236. };
  237.  
  238. class TProgressDialog : public TDialog
  239. /****************************************************************************
  240. Dette er en dialogboks som viser hvor langt brukeren er kommet i en
  241. tidkrevende operasjon. Den s°rger ogsσ for at brukeren har muligheten
  242. for σ avbryte en operasjon.
  243.  
  244. Instansieres av    tidkrevende operasjoner i TPictureWindow og
  245. TComplexWindow (FFT og en del operasjoner i den forbindelsen).
  246.  
  247. Alle medlemsfunksjonene finnes og er nµrmere beskrevet i PROFFTDB.CPP.
  248.  
  249. Superklasser:    TDialog
  250.  
  251. Subklasser:    Ingen
  252.  
  253. Skrevet av:
  254.     MK
  255. ****************************************************************************/
  256. {
  257. public:
  258.     TProgressDialog(PTWindowsObject AParent, LPSTR lpszDialogName, LPSTR lpszCaption);
  259.     ~TProgressDialog();
  260.  
  261.     //  Svarer pσ beskjeder fra Windows
  262.     virtual void WMInitDialog(RTMessage Msg) = [WM_FIRST + WM_INITDIALOG];
  263.     virtual void WMCommand(RTMessage Msg) = [WM_FIRST + WM_COMMAND];
  264.  
  265.     //  Svarer pσ beskjeder fra foreldreobjektet (det objektet som
  266.     //  instansierte objektet).
  267.     virtual void WMSetText(RTMessage Msg) = [WM_FIRST + WM_SETPROGRESSTEXT];
  268.     virtual void WMSetProgress(RTMessage Msg) = [WM_FIRST + WM_SETPROGRESS];
  269.  
  270.     //  Gir foreldreobjektet mulighet for σ sjekke om brukeren har
  271.     //  avbrutt den nσvµrende operasjonen.
  272.     BOOL CancelPressed();
  273. private:
  274.     BOOL bCancel;        //  Inneholder hvorvidt brukeren har trykket
  275.                                     //  pσ Cancel knappen. Initialiseres til FALSE
  276.                                     //  ved initialisering av objektet. Settes til
  277.                                     //  TRUE hvis objektet mottar beskjed fra Windows
  278.                                     //  om at Cancelknappen er trykket (gjennom WMCommand).
  279.  
  280.     //  Inneholder teksten i dialogboksen
  281.     char acPercentage[5];
  282.     char acMessage[MAX_CAPTION_LENGTH];
  283.  
  284.     //  Inneholder prosent ganger 100 hvor langt vi er kommet hittil.
  285.     //  Brukes i WMSetProgress for σ sjekke om vi er kommet lenger enn
  286.     //  forrige gang (i %).
  287.     long lSoFar;
  288.  
  289.     //  Handle til pennen vi tegner i prosentfirkanten. Initialiseres
  290.     //  ved initialisering av objektet, deallokeres i destructoren.
  291.     HBRUSH hBrush;
  292.  
  293.     //  Husker tegneflaten til denne dialogboksen. Initialiseres
  294.     //  sammen med objektet.
  295.     HDC hdc;
  296.     RECT rect;
  297.  
  298.     //  Handle til Cancelknappen. Initialiseres sammen med objektet.
  299.     HWND hCtrl;
  300. };
  301.  
  302. class TGenericPicWindow : public TWindow
  303. /****************************************************************************
  304. Dette er superklassen til TPictureWindow og TComplexWindow. Denne klassen
  305. inneholder de generelle tingene som begge subklassene trenger, f.eks.
  306. standard vindushσndtering.
  307.  
  308. Instansieres av    konstruktoren i TPictureWindow eller TComplexWindow.
  309.  
  310. Alle medlemsfunksjonene finnes og er nµrmere beskrevet i GENPWIN.CPP.
  311.  
  312. Superklasser:    TWindow
  313.  
  314. Subklasser:    TPictureWindow, TComplexWindow
  315.  
  316. Skrevet av:
  317.     MK
  318. Sist forandret:
  319.     12.3.92/MK: Lagde klassedefinisjonen
  320.     20.4.92/MK: La inn st°ttefunksjoner for lettere kopiering av nye
  321.                             objekter, samt muligheten for σ manipulere bitmaps
  322.                             som ikke n°dvendigvis var allokert av objektet (dvs.
  323.                             gj°re ting over i en ny bitmap).
  324. ****************************************************************************/
  325. {
  326. public:
  327.     //  Initialisering og deallokering
  328.     TGenericPicWindow(PTWindowsObject AParent, LPSTR FileName,
  329.                                     BITMAPINFO *bmpInfo, HANDLE hBitmap, BOOL bBitmap);
  330.     virtual ~TGenericPicWindow();
  331.  
  332.     //  Svarer pσ beskjeder fra Windows
  333.     virtual void WMSize(TMessage&) = [WM_FIRST + WM_SIZE];
  334.     virtual void Paint(HDC, PAINTSTRUCT&);
  335.  
  336.     //  Funksjoner som dette objektet kan gj°re med seg selv
  337.     void EditCopy();  //  Kopierer DIBitmap over i clipboard
  338.  
  339.     //  Peker til bildestrukturdataene, som inneholder st°rrelse,
  340.     //    farger i bildet osv. (se beskrivelse av BITMAPINFO struktur).
  341.     //  Brukes av TPictureWindow og TComplexWindow objektene.
  342.     LPBITMAPINFO bmpInfo;
  343.  
  344.     //  Handle til selve bitmappen. Initialiseres i konstruktoren og
  345.     //  brukes senere av LockBMP og UnlockBMP og
  346.     //  av TPictureWindow og TComplexWindow objektene.
  347.     HANDLE hBitmap;
  348.  
  349.     //  Husker opprinnelsen til objektet (vanligvis filnavn, men kan
  350.     //  ogsσ komme fra clipboard.
  351.     //  Brukes av TPictureWindow og TComplexWindow objektene.
  352.     char FileName[MAXPATH];
  353.  
  354.     //  St°ttefunksjoner for hσndtering/duplisering av objektet.
  355.     //  Brukes av TPictureWindow og TComplexWindow objektene.
  356.     void CopyBMP(HANDLE hSourceBitmap, HANDLE hTargetBitmap);
  357.     void CopyBMPInfo(LPSTR source, LPSTR target);
  358.     void AdjustScroller();
  359.     BITMAPINFO* MakeDuplicateBMPInfo(LPBITMAPINFO source);
  360.  
  361.     //  St°ttefunksjoner for σ fσ tilgang til bitmappen
  362.     BOOL LockBMP();
  363.     void UnlockBMP();
  364.  
  365.     //  Peker til bitmappen. MERK! Denne er ikke gyldig f°r LockBMP
  366.     //  er kallt. Da er den gyldig til UlockBMP kalles igjen.
  367.     char huge *hpBitmap;
  368.  
  369.     //  En peker til en Statusdialogboks som viser hvor langt vi er
  370.     //  kommet i en operasjon og gir brukeren muligheten for σ avbryte.
  371.     TProgressDialog *pdbProgress;
  372. };
  373.  
  374. class TPictureWindow : public TGenericPicWindow
  375. /****************************************************************************
  376. Dette er subklassen til TGenericPicWindow og er det objektet som brukes
  377. til σ vise "simple" bitmapbilder pσ skjermen. Disse kan enten hentes fra
  378. disk eller fra clipboard. Den har bare en utvidelse i forhold til
  379. TGenericPicWindow, nemlig FFT transformen som tar seg av σ transformere
  380. bildet over i et TComplexWindow objekt.
  381.  
  382. Instansieres av    TMainWindow.CreateChild(..).
  383.  
  384. Alle medlemsfunksjonene finnes og er nµrmere beskrevet i PICTWIN.CPP.
  385.  
  386. Superklasse: TGenericPicWindow
  387.  
  388. Subklasse: Ingen.
  389.  
  390. Skrevet av: MK
  391.  
  392. Sist forandret:
  393.     12.3.92/MK: Lagde klassedefinisjonen
  394. ****************************************************************************/
  395. {
  396. public:
  397.     //  Initialisering
  398.     TPictureWindow(PTWindowsObject AParent, LPSTR FileName,
  399.                                     BITMAPINFO *bmpInfo, HANDLE hBitmap) :
  400.             TGenericPicWindow(AParent, FileName, bmpInfo, hBitmap, TRUE) {};
  401.  
  402.     //  Svarer pσ beskjeder fra Windows
  403.     virtual void WMMDIActivate(RTMessage Msg) = [WM_FIRST + WM_MDIACTIVATE];
  404.  
  405.     //  Utf°rer FFT pσ dette bildeobjektet. Instansierer et
  406.     //  TComplexWindow objekt ved σ kalle TMainWindow.CreateComplexChild
  407.     //  og kopiere seg selv over i dette. Deretter ber det om at det
  408.     //  nye komplekse objektet utf°rer FFT pσ seg selv. Kalles fra
  409.     //  TMainWindow.CMTransformFFT.
  410.     void PerformFFT();
  411.  
  412.     //  Inverterer seg selv. Kalles fra CMTransformInvert.
  413.     void Invert();
  414. private:
  415.     //  Setter de aktuelle menyvalg for dette objektet. Kalles ved
  416.     //  aktivisering av dette objektet (vinduet) v.h.a. WMMDIActivate.
  417.     void SetMenuItems(WORD wStatus);
  418.  
  419.     //  Registrerer vindusklassen og velger standardicon
  420.     virtual void GetWindowClass(WNDCLASS& wc);
  421.     virtual LPSTR GetClassName();
  422.  
  423. };
  424.  
  425. class TComplexWindow : public TGenericPicWindow
  426. /****************************************************************************
  427. Dette er subklassen til TGenericPicWindow og er det objektet som brukes
  428. til de komplekse bildene. Det bildet som synes pσ skjermen er en
  429. logaritmisk amplitude/frekvens representasjon. De egentlige dataene
  430. ligger pσ et eget allokert omrσde (pekt pσ av ComplexPicture pekeren).
  431.  
  432. Instansieres av    TMainWindow.CreateComplexChild(..)
  433.  
  434. Alle medlemsfunksjonene med unntak av ExecuteSmallDialog() og
  435. ExecuteLargeDialog() finnes og er nµrmere beskrevet i COMPWIN.CPP.
  436. De to f°rstnevne finnes sammen med de andre dialogboksene i PROFFTDB.CPP.
  437.  
  438. Superklasse: TGenericPicWindow
  439.  
  440. Subklasse: Ingen.
  441.  
  442. Skrevet av:    MK
  443. Sist forandret:
  444.     12.3.92/MK: Lagde klassedefinisjonen
  445.     20.4.92/MK: La inn filtre m.m.
  446. ****************************************************************************/
  447. {
  448. public:
  449.     //  Initialisering og deallokering
  450.     TComplexWindow(PTWindowsObject AParent, LPSTR lpszCaption,
  451.             HANDLE hComplexPict, BITMAPINFO *bmpInfo, HANDLE hBitmap);
  452.     ~TComplexWindow();
  453.  
  454.     //  Svarer pσ Windows beskjeder
  455.     virtual void WMMDIActivate(RTMessage) = [WM_FIRST + WM_MDIACTIVATE];
  456.     virtual void WMSetCursor(RTMessage Msg) = [WM_FIRST + WM_SETCURSOR];
  457.     virtual void Paint(HDC, PAINTSTRUCT& PaintStruct);
  458.     virtual void WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN];
  459.     virtual void WMLButtonUp(RTMessage Msg) = [WM_FIRST + WM_LBUTTONUP];
  460.     virtual void WMRButtonDown(RTMessage) = [WM_FIRST + WM_RBUTTONDOWN];
  461.     virtual void WMMouseMove(RTMessage Msg) = [WM_FIRST + WM_MOUSEMOVE];
  462.  
  463.     //  Operasjoner som det komplekse objektet kan utf°re pσ seg selv.
  464.     //  Alle operasjoner som gj°res pσ det komplekse objektet skjer ved
  465.     //  at objektet f°rst lager en kopi av seg selv og utf°rer operasjonen
  466.     //  pσ kopien. Orginalen beholdes alltid!
  467.     void PerformIFFT();                             // Inverstransformen
  468.     void PerformFFT();                             // Vanlig fouriertransform
  469.     void ExecuteFilter(HDC hdcMem);  // Filtrering
  470.  
  471.     //  Starter filterdialogboksene og kaller PrepareToExecuteFilter()
  472.     //  hvis brukeren avslutter dialogboksen ved σ trykk OK knappen.
  473.     void ExecuteSmallDialog();             // Filtre med en radius
  474.     void ExecuteLargeDialog();             // Filtre med to radiuser
  475.     void PrepareToExecuteFilter();     // Klargj°ring for filtrering
  476.  
  477.     //  Nedenfor f°lger en del statusdata om objektets tilstand.
  478.     //  Disse dataene kunne med fordel
  479.     //  ha blitt flyttet over i konstruktoren og blitt satt der, slik
  480.     //  at vi kunne unngσtt og ha de som public i dette objektet, men
  481.     //  dessverre rakk ikke tiden til.. Dataene kopieres over i det
  482.     //  nye objektet og settes slik at objektet oppdaterer seg selv
  483.     //  ved σ vise sin komplekse representasjon.
  484.  
  485.     //  Minste og st°rste radius i filterdialogboksen.
  486.     int iLowerValue;
  487.     int iUpperValue;
  488.  
  489.     //  Type filter som er utf°rt pσ dette objektet.
  490.     int iFilterType;
  491.  
  492.     //  Forteller om det komplekse bildet i objektet er sentrert.
  493.     BOOL bWasShiftCentered;
  494.  
  495.     //  Forteller om Paint rutinen skal vise filterverdiene som r°de
  496.     //  sirkler i bildet.
  497.     BOOL bShowFilter;
  498.  
  499.     //  Forteller om det er n°dvendig σ lage bitmappen pσ nytt fra det
  500.     //  komplekse bildet. Det er for eksempel ikke n°dvendig ved de filtrene
  501.     //  som fjerner deler av frekvensplanet, da tegner vi rett i det komplekse
  502.     //  og rett inn i bitmappen samtidig. Men med Butterworth filtrene som
  503.     //  modifiserer alle punktene i det komplekse bildet mσ vi lage hele
  504.     //  bitmapbildet pσ nytt.
  505.     BOOL bDirty;
  506.  
  507.     //  Forteller om det er n°dvendig σ foreta reskalering av det komplekse
  508.     //  bildet. Dette gj°res ikke ved fjerning av deler i frekvensplanet,
  509.     //  da vi ville fσtt et gap fra 0 til den minste amplituden som ville
  510.     //  blitt reservert til en del grσtoner, selv om det faktisk ikke er
  511.     //  noen deler som havner i denne rangen. Men ved bruk av Butterworth
  512.     //  er vi n°dt til σ reskalere bildet fordi denne forandrer pσ rangen
  513.     //  av hvilke grσtoner vi trenger σ vise.
  514.     BOOL bRescale;
  515.  
  516. private:
  517.     //  Tidkrevende st°ttefunksjoner i forbindelse med transformen.
  518.     //  Alle returnerer TRUE hvis operasjonen ble fullf°rt, FALSE
  519.     //  ellers. Hvis en operasjon ble avbrutt s°rger kallrutinen for
  520.     //  σ rydde opp, slik at alt blir som f°r operasjonen ble satt i
  521.     //  gang.
  522.     BOOL FFT(HANDLE hTarget);
  523.     BOOL UpdateBitmap();
  524.     BOOL ConvertBMPToComplex(HANDLE hSourceBitmap, HANDLE hTargetComplex);
  525.     BOOL ConvertComplexToBMP(HANDLE hSourceComplex, HANDLE hTargetBitmap);
  526.     BOOL MakeComplexConjugate(HANDLE hComp);
  527.  
  528.     //  St°ttefunksjoner for objektet
  529.  
  530.     //  Setter/tar vekk de aktuelle menyvalgene nσr vinduet blir
  531.     //  aktivert deaktivert
  532.     void SetMenuItems(WORD wStatus);
  533.     //  Kopierer et komplekst bilde over i et annet.
  534.     void CopyComplex(HANDLE hSource, HANDLE hTarget);
  535.     //  Locker det komplekse bildet, setter hpComplex til σ peke
  536.     //  pσ bildet.
  537.     BOOL LockComplex();
  538.     //  Unlocker det komplekse bildet.
  539.     void UnlockComplex();
  540.     //  Tegner med r°dt hvis museposisjonen befinner seg innenfor
  541.     //  bildet i klientomrσdet. Kalles av WMLButtonDown og
  542.     //  WMMouseMove.
  543.     void DrawFreehand(RTMessage Msg);
  544.  
  545.     //  Registrerer vindusklassen og velger standardicon
  546.     virtual void GetWindowClass(WNDCLASS& wc);
  547.     virtual LPSTR GetClassName();
  548.  
  549.     //  Brukes til σ lagre st°rste og minste verdi i bildet ved reskalering.
  550.     //  Dette gj°res for at vi skal representere det komplekse bildet
  551.     //  best mulig ved hjelp av de grσtonene vi har til rσdighet.
  552.     real MaxLogAmplitude, MinLogAmplitude;
  553.  
  554.     //  Handle til det komplekse bildet. Brukes av LockComplex og
  555.     //  UnlockComplex.
  556.     HANDLE hComplex;
  557.  
  558.     //  Huge pointer til det komplekse bildet. Kun brukbar etter
  559.     //  en LockComplex (men ikke etter UnlockComplex).
  560.     prcomplex huge *hpComplex;
  561.  
  562.     //  Forteller om brukeren har venstre museknapp nede. Settes og
  563.     //  brukes av WMLButtonDown, WMLButtonUp, WMRButtonDown og WMMouseMove.
  564.     BOOL bButtonDown;
  565.  
  566.     //  Diverse variable som holder status til den flaten vi tegner
  567.     //  pσ ved frihσndsfiltrering. Inneholder ogsσ brushen og
  568.     //  pennen vi tegner med.
  569.     HDC DragDC;
  570.     HBRUSH hbrRed;
  571.     HPEN hpenRed;
  572.  
  573.     //  Denne fσr vite fra Windows v.h.a. en SetPixel ved initialisering
  574.     //  av objektet hvordan dette datasystemet representerer fargen r°d
  575.     //  slik at frihσndsfilteret kan finne igjen denne fargen ved senere
  576.     //  filtrering.
  577.     DWORD rgbRed;
  578.  
  579.     //  Et komplekst tall som settes = 0 ved initialisering av objektet.
  580.     //  Denne verdien brukes ved nullstilling av deler av det komplekse
  581.     //  bildet (raskere σ kopiere en verdi en σ "regne" om til null hver
  582.     //  gang).
  583.     prcomplex compZero;
  584. };
  585.  
  586.  
  587. class TPROfftFileDialog : public TFileDialog
  588. /****************************************************************************
  589. Standardobjektet som brukes i forbindelse med filσpning og lagring.
  590. Kalles fra TMainWindow.CMFileOpen og TMainWindow.CMFileSaveAs nσr brukeren
  591. velger Open eller Save As fra menyen.
  592.  
  593. Superklasser:  TFileDialog
  594.  
  595. Subklasser:        Ingen.
  596.  
  597. Skrevet av:
  598.     MK
  599. Sist forandret:
  600.     12.3.92/MK: Lagde klassedefinisjonen
  601. ****************************************************************************/
  602. {
  603. public:
  604.     //  Initialisering. Kaller den aktuelle fildialogboksen. ResourceID
  605.     //  inneholder CM_FILEOPEN eller CM_FILESAVEAS ettersom vi °nsker
  606.     //  en filσpne eller fillagre dialogboks.
  607.         TPROfftFileDialog(PTWindowsObject AParent, int ResourceId,
  608.                                      LPSTR AFilePath, PTModule AModule = NULL)
  609.          : TFileDialog(AParent, ResourceId, AFilePath, AModule)
  610.              { strcpy(Extension, ".bmp"); } // Sender med default file extension.
  611. };
  612.  
  613.  
  614. class TFilter1 : public TDialog
  615. /****************************************************************************
  616. Dette er dialogboksen som brukes ved alle filtre som krever en radius.
  617. Dvs. CM_FILTERLOWPASS, CM_FILTERHIGHPASS, CM_FILTERBWLOWPASS,
  618. CM_FILTERBWHIGHPASS. Konstruktoren bare setter opp
  619. kontrollene i dialogboksen.
  620.  
  621. Skrevet av:
  622.     SA.
  623. Sist forandret:
  624.     30.03.92  SA  Lagde klassedefinisjonen.
  625.     21.04.92  MK  St°tte for "hold and drag" scrollbarene med oppdatering.
  626. ****************************************************************************/
  627. {
  628. public:
  629.     //  Initialisering
  630.     TFilter1(PTWindowsObject AParent, LPSTR AName);
  631.  
  632.     //  Svarer pσ beskjeder fra Windows
  633.     virtual void WMHScroll(RTMessage Msg) = [WM_FIRST + WM_HSCROLL];
  634.     virtual void WMInitDialog(RTMessage Msg) = [WM_FIRST + WM_INITDIALOG];
  635.  
  636.     //  Svarer pσ beskjeder fra Windows ved aktivisering av de forskjellige
  637.     //  kontrollene. Brukes for σ oppdatere alle feltene i dialogboksen.
  638.     virtual void IDHScrollBar(RTMessage Msg) = [ID_FIRST + DB_SCROLLFREQUENCY];
  639.     virtual void IDEditFrequency(RTMessage Msg) = [ID_FIRST + DB_EDITFREQUENCY];
  640.  
  641.     //  Returnerer om vi tillater lukning av boksen (om verdiene er lovlige).
  642.     virtual BOOL CanClose();
  643. private:
  644.     //  Oppdaterer foreldreobjektet sine parametre (hvis brukeren avslutter
  645.     //  ved σ trykke OK knappen).
  646.     void UpdateParent();
  647.  
  648.     //  Brukes til σ lagre maksimalverdien for radiusen (sparer oss for
  649.     //  gjentatte flyttallsoperasjoner).
  650.     int iMax;
  651. };
  652.  
  653. class TFilter2 : public TDialog
  654. /****************************************************************************
  655. Dette er dialogboksen som brukes ved alle filtre som krever to radiuser.
  656. Dvs. CM_FILTERBANDPASS, CM_FILTERBANDSTOPP. Konstruktoren bare setter opp
  657. kontrollene i dialogboksen.
  658.  
  659. Skrevet av:
  660.     SA.
  661. Sist forandret:
  662.     30.03.92  SA  Lagde klassedefinisjonen.
  663.     21.04.92  MK  St°tte for "hold and drag" scrollbarene med oppdatering.
  664. ****************************************************************************/
  665. {
  666. public:
  667.     //  Initialisering
  668.     TFilter2(PTWindowsObject AParent, LPSTR AName);
  669.  
  670.     //  Svarer pσ beskjeder fra Windows
  671.     virtual void WMInitDialog(RTMessage Msg) = [WM_FIRST + WM_INITDIALOG];
  672.     virtual void WMHScroll(RTMessage Msg) = [WM_FIRST + WM_HSCROLL];
  673.  
  674.     //  Svarer pσ beskjeder fra Windows ved aktivisering av de forskjellige
  675.     //  kontrollene. Brukes for σ oppdatere alle feltene i dialogboksen.
  676.     virtual void IDHScrollBar1(RTMessage Msg) = [ID_FIRST + DB_SCROLLFREQUENCY1];
  677.     virtual void IDHScrollBar2(RTMessage Msg) = [ID_FIRST + DB_SCROLLFREQUENCY2];
  678.     virtual void IDEditFrequency1(RTMessage Msg) = [ID_FIRST + DB_EDITFREQUENCY1];
  679.     virtual void IDEditFrequency2(RTMessage Msg) = [ID_FIRST + DB_EDITFREQUENCY2];
  680.  
  681.     //  Returnerer om vi tillater lukning av boksen (om verdiene er lovlige).
  682.     virtual BOOL CanClose();
  683. private:
  684.     //  Oppdaterer foreldreobjektet sine parametre (hvis brukeren avslutter
  685.     //  ved σ trykke OK knappen).
  686.     void UpdateParent();
  687.  
  688.     //  Brukes til σ lagre maksimalverdien for radiusen (sparer oss for
  689.     //  gjentatte flyttallsoperasjoner).
  690.     int iMax;
  691. };
  692.  
  693. /****************************************************************************
  694. Dette er dialogboksen som lar brukeren forandre pσ standardopsjonene i programmet.
  695. Allokerer objektene i dialogboksen. Sender parametrene videre til
  696. superklassen som henter dialogboksen fra ressursfilen.
  697. class TOptions
  698.  
  699. Skrevet av:
  700.     SA.
  701. Sist forandret:
  702.     05.04.92  SA  Lagde klassedefinisjonen.
  703.     21.04.92  MK  La inn st°tte for "hold and drag" pσ scrollbarene.
  704.     25.04.92    MK    Opsjon for σ sentrere i frekvensplanet.
  705.                                 Radiobuttons for forskjellige typer viskelµr.
  706. ****************************************************************************/
  707. class TOptions : public TDialog
  708. {
  709. public:
  710.     //  Initialisering
  711.     TOptions(PTWindowsObject AParent, LPSTR AName);
  712.  
  713.     //  Svarer pσ Windows beskjeder
  714.     virtual void WMInitDialog(RTMessage Msg) = [WM_FIRST + WM_INITDIALOG];
  715.     virtual void WMCommand(RTMessage Msg) = [WM_FIRST + WM_COMMAND];
  716.     virtual void WMHScroll(RTMessage Msg);
  717.  
  718.     //  Svarer pσ Windows beskjeder nσr brukeren aktiverer scrollbaren
  719.     //  i dialogboksen.
  720.     virtual void IDHScrollBar(RTMessage Msg) = [ID_FIRST + DB_SCROLLRUBBER];
  721.  
  722.     //  Sjekker om brukeren avslutt med OK knappen. Hvis sσ, oppdater
  723.     //  datamedlemmene fra slik de nσ er satt i dialogboksen.
  724.     virtual void CloseWindow(int iRetValue);
  725. };
  726.  
  727. #endif